#include <iostream>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

using namespace std;

// void handler(int signo)
// {
//     //处理向指定进程发送信号时的方法
//     cout << "get a sig, number is : " << signo << endl;
//     exit(100);
// }

// int main()
// {  
//     //siganl调用完，handler方法不会被立即执行
//     //handler是设置对应信号的处理方法，只有未来我们收到对应的信号才执行handler方法
//     //若永远没有收到信号标识符那么将永远不会被执行
//     signal(SIGINT, handler); //信号编号为2
//     while (true)
//     {
//         cout << "I am activing..., pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }


// int main()
// {
//     //忽略信号2
//     signal(SIGINT, SIG_IGN);
//     while (true)
//     {
//         cout << "I am activing..., pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }


/*//命令行参数指定为3个，如：mykill -9 pid向指定pid进程发送编号为9的信号（mykill: 形成的可执行程序）
int main(int argc, char *argv[])
{
    //判断使用用法
    if(argc != 3)
    {
        cout << "Usage: " << argv[0] << " -signumber pid" << endl;
        return 1;
    }

    //拿到各个数字编号
    int signumber = stoi(argv[1]+1);
    int pid = stoi(argv[2]);

    int n = kill(pid, signumber);
    if(n < 0)
    {
        cerr << "kill error, " << strerror(errno) << endl;
    }
    return 0;
}*/


/*int main()
{
    signal(2, handler);
    int cnt = 0;
    while(true)
    {
        cout << "cnt: " << cnt++ << endl;
        sleep(1);
        if(cnt % 5 == 0) 
        {
            cout << "send 2 to caller" << endl;
            raise(2); 
            abort(); //终止当前进程
        }
    }
    return 0;
}*/


// int g_cnt = 0;
// int ret = 0;

// void handler(int sig)
// {
//     cout << "get a sig: " << sig << " g_cnt: " << g_cnt << endl;
//     //这种模式是设置无限次alarm闹钟——每当闹钟发送SIGALRM信号时又将会设置5秒闹钟
//     //重新设置闹钟时，若上一次的闹钟还没有响应，这里会更新闹钟的响应时间
//     unsigned int n = alarm(5); //返回上一次alarm的剩余时间，下面的打印可看出
//     cout << "还剩多少时间: " << n << endl;
// }

// int main()
// {
//     signal(SIGALRM, handler);
//     //设置alarm闹钟，下面的程序当运行5秒后自动发送SIGALRM信号
//     alarm(5); // 注意：闹钟只会响一次，即5秒过后只会向该进程发送一次SIGALRM信号

//     int cnt = 0;
//     while(true)
//     {
//         sleep(1);
//         cout << "cnt : " << cnt++ << ", pid is : "<< getpid() << endl;
//         //下面的条件判断用于测试alarm(0)取消闹钟功能
//         /*if(cnt == 2)
//         {
//             int n = alarm(0); //取消闹钟
//             cout << " alarm(0) ret : " << n << endl;
//         }*/
//     }
//     return 0;
// } 


/* void handler(int sig)
{
    //处理异常信号只输出一句话，若这里不终止进程，即代码异常一直存在，则系统会一直发送异常信号（这里对应的异常信号是8或11），一直执行该函数。
    cout << "get a sig: " << sig << endl;
    //exit(1);
}

int main()
{
    //除0异常,系统抛出SIGFPE信号（8号信号）
    //信号8：通常被称为浮点异常信号
    //signal(SIGFPE, handler);
    //int a = 10;
    //a /= 0;

    //野指针赋值抛异常，系统发送信号SIGSEGV（11号信号）
    //信号11：段错误信号，通常是由于程序中的内存访问错误、指针错误或其他类似问题导致的
    //signal(SIGSEGV, handler);
    //int *p = nullptr; //野指针
    //*p = 100; 
    return 0;
} */

